package main

import (
	"fmt"
	"text/template"
	"unsafe"
)

// MyTemplate 定义和 template.Template 只是形似
type MyTemplate struct {
	name       string
	parseTree  *unsafe.Pointer
	common     *unsafe.Pointer
	leftDelim  string
	rightDelim string
}

func main() {
	t := template.New("Foo")
	p := (*MyTemplate)(unsafe.Pointer(t))
	p.name = "Bar" // 关键在这里，突破私有成员
	fmt.Println(p, p.name, t)

	fmt.Println("----------example2--------------")
	u := uint32(32)
	i := int32(1)
	fmt.Println(&u, &i) // 打印出地址
	ptr := &i           // ptr 的类型是 *int32
	fmt.Println("ptr1:", *ptr)
	//ptr = &u 			// error,&u的类型是 *uint32，于ptr的类型不同，不能赋值
	//ptr = (*int32)(&u)  // error,这种类型转换语法也是无效的
	ptr = (*int32)(unsafe.Pointer(&u)) //unsafe包提供的Pointer方法可以完成类型转换的任务
	fmt.Println("ptr2:", *ptr)
}
